## 合并 Excel 指定的列


import pandas as pd
from openpyxl import load_workbook
from openpyxl.styles import Alignment

# 读取Excel文件
file_path = 'C:\\Users\\Administrator\\Desktop\\wj\\0424\\根据23个商品名称筛选后的订单列表(最终版).xlsx'

df = pd.read_excel(file_path)

# 假设A列（列名'单号'）是合并依据的列
merge_column = '单号'

# 获取所有唯一的单号值，并排序
unique_orders = sorted(df[merge_column].dropna().unique())

# 创建一个字典来存储合并范围
merge_ranges = {}

# 遍历每个单号，找到他们的行范围，并确定合并范围
for i, order in enumerate(unique_orders):
    # 获取单号所在行的索引
    order_rows = df.index[df[merge_column] == order].tolist()

    # 如果单号有多行，找到最小和最大行号（假设行号是连续的）
    if len(order_rows) > 0:
        min_row = min(order_rows) + 2  # 假设第一行是标题，因此+2对应Excel中的行号
        max_row = max(order_rows) + 2

        # 如果是第一个单号，合并到下一个单号的前一行
        if i == 0:
            # 确保合并范围有效
            if len(unique_orders) > 1:
                next_order_min_row = min(df.index[df[merge_column] == unique_orders[i + 1]].tolist()) + 2
                merge_ranges[(min_row, next_order_min_row - 1)] = True
            else:
                merge_ranges[(min_row, max_row)] = True
                # 如果是最后一个单号，合并到文件末尾
        elif i == len(unique_orders) - 1:
            merge_ranges[(min_row, max_row)] = True
            # 否则，合并到下一个单号的前一行
        else:
            next_order_min_row = min(df.index[df[merge_column] == unique_orders[i + 1]].tolist()) + 2
            merge_ranges[(min_row, next_order_min_row - 1)] = True

        # 打印合并范围（用于调试）
print(merge_ranges)

# 加载工作簿
wb = load_workbook(file_path)
ws = wb.active

# 定义不需要合并的列索引（从0开始计数，因此3rd列是索引2，4th列是索引3，6th列是索引5）
columns_to_exclude = [3, 4, 6]

# 获取需要合并的列索引
columns_to_merge = [col_idx for col_idx in range(len(list(ws.iter_cols(1)))) if col_idx not in columns_to_exclude]

# 打印需要合并的列索引（用于调试）
print(columns_to_merge)

# 遍历每个合并范围，执行合并操作
for (start, end), _ in merge_ranges.items():
    # 确保合并范围有效
    if start < end:
        # 遍历需要合并的列
        for col in columns_to_merge:
            # 合并单元格
            ws.merge_cells(start_row=start, start_column=col + 1, end_row=end, end_column=col + 1)
            # 设置居中
            cell = ws.cell(row=start, column=col + 1)
            cell.alignment = Alignment(horizontal='center', vertical='center')

        # 保存修改后的文件
output_file_path = '../merged_file-根据23个商品名称筛选后的订单列表.xlsx'
wb.save(output_file_path)

# 返回处理后的文件路径
print(output_file_path)
